home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1998 June / SGI Freeware 1998 June.iso / dist / fw_IZzip.idb / usr / freeware / src / zip / nt / nt.c.z / nt.c
C/C++ Source or Header  |  1997-09-09  |  5KB  |  208 lines

  1. /*
  2.  * NT specific functions for ZIP.
  3.  *
  4.  * The NT version of ZIP heavily relies on the MSDOS and OS2 versions,
  5.  * since we have to do similar things to switch between NTFS, HPFS and FAT.
  6.  */
  7.  
  8.  
  9. #include "zip.h"
  10.  
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <time.h>
  14. #include <ctype.h>
  15. #include <windows.h>
  16. #include "ntzip.h"
  17.  
  18. #define A_RONLY    0x01
  19. #define A_HIDDEN   0x02
  20. #define A_SYSTEM   0x04
  21. #define A_LABEL    0x08
  22. #define A_DIR      0x10
  23. #define A_ARCHIVE  0x20
  24.  
  25.  
  26. #define EAID     0x0009
  27.  
  28.  
  29. #ifndef UTIL
  30.  
  31. extern int noisy;
  32.  
  33.  
  34. /* FAT / HPFS detection */
  35.  
  36. int IsFileSystemFAT(char *dir)
  37. {
  38.   char root[4];
  39.   char vname[128];
  40.   DWORD vnamesize = sizeof(vname);
  41.   DWORD vserial;
  42.   DWORD vfnsize;
  43.   DWORD vfsflags;
  44.   char vfsname[128];
  45.   DWORD vfsnamesize = sizeof(vfsname);
  46.   
  47.     /*
  48.      * We separate FAT and HPFS+other file systems here.
  49.      * I consider other systems to be similar to HPFS/NTFS, i.e.
  50.      * support for long file names and being case sensitive to some extent.
  51.      */
  52.  
  53.     strncpy(root, dir, 3);
  54.     if ( isalpha(root[0]) && (root[1] == ':') ) {
  55.       root[0] = to_up(dir[0]);
  56.       root[2] = '\\';
  57.       root[3] = 0;
  58.     }
  59.     else {
  60.       root[0] = '\\';
  61.       root[1] = 0;
  62.     }
  63.  
  64.     if ( !GetVolumeInformation(root, vname, vnamesize,
  65.                          &vserial, &vfnsize, &vfsflags,
  66.                          vfsname, vfsnamesize)) {
  67.         fprintf(mesg, "zip diagnostic: GetVolumeInformation failed\n");
  68.         return(FALSE);
  69.     }
  70.  
  71.     return( strcmp(vfsname, "FAT") == 0 );
  72. }
  73.  
  74. /* access mode bits and time stamp */
  75.  
  76. int GetFileMode(char *name)
  77. {
  78. DWORD dwAttr;
  79.  
  80.   dwAttr = GetFileAttributes(name);
  81.   if ( dwAttr == -1 ) {
  82.     fprintf(mesg, "zip diagnostic: GetFileAttributes failed\n");
  83.     return(0x20); /* the most likely, though why the error? security? */
  84.   }
  85.   return(
  86.           (dwAttr&FILE_ATTRIBUTE_READONLY  ? A_RONLY   :0)
  87.         | (dwAttr&FILE_ATTRIBUTE_HIDDEN    ? A_HIDDEN  :0)
  88.         | (dwAttr&FILE_ATTRIBUTE_SYSTEM    ? A_SYSTEM  :0)
  89.         | (dwAttr&FILE_ATTRIBUTE_DIRECTORY ? A_DIR     :0)
  90.         | (dwAttr&FILE_ATTRIBUTE_ARCHIVE   ? A_ARCHIVE :0));
  91. }
  92.  
  93. long GetTheFileTime(char *name)
  94. {
  95. HANDLE h;
  96. FILETIME ft, lft;
  97. WORD dh, dl;
  98.  
  99.   h = CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING,
  100.                  FILE_ATTRIBUTE_NORMAL, NULL);
  101.   if ( h != INVALID_HANDLE_VALUE ) {
  102.     GetFileTime(h, NULL, NULL, &ft);
  103.     FileTimeToLocalFileTime( &ft, &lft);
  104.     FileTimeToDosDateTime( &lft, &dh, &dl);
  105.     CloseHandle(h);
  106.     return(dh<<16) | dl;
  107.   }
  108.   else
  109.     return 0L;
  110. }
  111.  
  112. void ChangeNameForFAT(char *name)
  113. {
  114.   char *src, *dst, *next, *ptr, *dot, *start;
  115.   static char invalid[] = ":;,=+\"[]<>| \t";
  116.  
  117.   if ( isalpha(name[0]) && (name[1] == ':') )
  118.     start = name + 2;
  119.   else
  120.     start = name;
  121.  
  122.   src = dst = start;
  123.   if ( (*src == '/') || (*src == '\\') )
  124.     src++, dst++;
  125.  
  126.   while ( *src )
  127.   {
  128.     for ( next = src; *next && (*next != '/') && (*next != '\\'); next++ );
  129.  
  130.     for ( ptr = src, dot = NULL; ptr < next; ptr++ )
  131.       if ( *ptr == '.' )
  132.       {
  133.         dot = ptr; /* remember last dot */
  134.         *ptr = '_';
  135.       }
  136.  
  137.     if ( dot == NULL )
  138.       for ( ptr = src; ptr < next; ptr++ )
  139.         if ( *ptr == '_' )
  140.           dot = ptr; /* remember last _ as if it were a dot */
  141.  
  142.     if ( dot && (dot > src) &&
  143.          ((next - dot <= 4) ||
  144.           ((next - src > 8) && (dot - src > 3))) )
  145.     {
  146.       if ( dot )
  147.         *dot = '.';
  148.  
  149.       for ( ptr = src; (ptr < dot) && ((ptr - src) < 8); ptr++ )
  150.         *dst++ = *ptr;
  151.  
  152.       for ( ptr = dot; (ptr < next) && ((ptr - dot) < 4); ptr++ )
  153.         *dst++ = *ptr;
  154.     }
  155.     else
  156.     {
  157.       if ( dot && (next - src == 1) )
  158.         *dot = '.';           /* special case: "." as a path component */
  159.  
  160.       for ( ptr = src; (ptr < next) && ((ptr - src) < 8); ptr++ )
  161.         *dst++ = *ptr;
  162.     }
  163.  
  164.     *dst++ = *next; /* either '/' or 0 */
  165.  
  166.     if ( *next )
  167.     {
  168.       src = next + 1;
  169.  
  170.       if ( *src == 0 ) /* handle trailing '/' on dirs ! */
  171.         *dst = 0;
  172.     }
  173.     else
  174.       break;
  175.   }
  176.  
  177.   for ( src = start; *src != 0; ++src )
  178.     if ( (strchr(invalid, *src) != NULL) || (*src == ' ') )
  179.       *src = '_';
  180. }
  181.  
  182. char *GetLongPathEA(char *name)
  183. {
  184.         return(NULL); /* volunteers ? */
  185. }
  186.  
  187. int IsFileNameValid(x)
  188. char *x;
  189. {
  190.         WIN32_FIND_DATA fd;
  191.         HANDLE h = FindFirstFile(x, &fd);
  192.  
  193.         if (h == INVALID_HANDLE_VALUE) return FALSE;
  194.         FindClose(h);
  195.         return TRUE;
  196. }
  197.  
  198. #endif /* UTIL */
  199.  
  200.  
  201. char *StringLower(char *szArg)
  202. {
  203.   unsigned char *szPtr;
  204.   for ( szPtr = szArg; *szPtr; szPtr++ )
  205.     *szPtr = lower[*szPtr];
  206.   return szArg;
  207. }
  208.